home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / vbl.zoo / vbl.asm
Assembly Source File  |  1993-04-04  |  3KB  |  99 lines

  1. ; Places a user defined routine in the VBL queue
  2. ;
  3. ; At each Vertical Blank Interrupt the computer will execute a bunch of
  4. ; system 'tasks', such as:
  5. ;
  6. ; 1) Checking to see if a new monitor was installed
  7. ; 2) Checking to see if the color palette has been changed
  8. ; 3) Disk drive routine is executed
  9. ;
  10. ; We can use this to make the computer execute our own routines during
  11. ; the VBL( Vertical BLank Interrupt).
  12. ;
  13. ; The maximum number of routines that can be executed in the VBL queue
  14. ; is 8 (see _nvbls $454 for value, it is initalized to 8)
  15. ;
  16. ; Address _vblqueue ($456) contains a pointer to the VBL queue
  17. ;
  18. ; When the computer starts to execute the routines in the queue
  19. ; it checks each address and the routine is executed unless the
  20. ; value is zero.
  21. ;
  22. ;
  23. ; What this program does:
  24. ; -----------------------
  25. ;      It will check each entry in the VBL queue and if that entry
  26. ;      contains a zero, we will place a pointer to our routine there.
  27. ;
  28. ;
  29. ;      jeff bilger
  30. ;      jmb8302@photon.tamu.edu
  31. ;      Texas A&M University
  32. ;
  33. start:                                 ; Calculate length of program
  34.    lea    program_end,a3               ; put last addr of prg in a3
  35.    suba.l 4(a7),a3                     ; subtract basepage, a3 holds total length of prg
  36.  
  37. enter_super:
  38.  move.l      #0,-(sp)            ; enter supervisor mode
  39.  move.w      #$20,-(sp)          ; Supervisor Stack Ptr SSP
  40.  trap        #1                  ; returned in d0
  41.  addq.l      #6,sp
  42.  movea.l     d0,a5               ; save SSP
  43.  
  44. Search_for_empty_slot:           ; Search for empty entry in queue
  45.  lea    $456,a4                  ; put addr that holds ptr to queue in a4
  46.  move.l (a4),a1                  ; put ptr to queue in a1
  47.                                  ; To access 1st entry do (a1)
  48.  move.l #0,d6                    ; for comparison purposes only
  49.  move.l #6,d1                    ; Loop max of 7 times
  50. loop:
  51.  move.l (a1),d5                  ; place contents into d5
  52.  cmp    d6,d5                    ; see if entry is 0
  53.  beq    install_code             ; if so, place ptr to my code in entry
  54.  addq.l #4,a1                    ; goto next entry (note:each entry is 1 longword or 4 bytes)
  55.  dbra   d1,loop                  ; decrement d1, if > -1 goto loop
  56.  
  57.  
  58. install_code:                    ; place addr of mycode in entry
  59.  lea  my_routine,a6              ; put addr of routine in a6
  60.  move.l  a6,(a1)                 ; store it in entry of queue
  61.  
  62. enter_user:                      ; enter user mode
  63.  pea     (a5)                    ; restore SSP
  64.  move.w  #$20,-(sp)
  65.  trap    #1
  66.  addq.l  #$6,sp
  67.  
  68. load_and_stay_res:               ; Keep code resident in memory
  69.  move.w  #0,-(sp)                ;
  70.  move.l  a3,-(sp)                ; a3 holds length of program
  71.  move.w  #$31,-(sp)
  72.  trap    #1
  73.                                  ; DONT update stack!!!
  74.  
  75. my_routine:
  76.  
  77. ; user routine. Install as LSR with GEMDOS $31 and end with rts!
  78.  
  79.  pea    string                   ; this code will just print a message
  80.  move.w #$9,-(sp)
  81.  trap   #1
  82.  addq.l #6,sp
  83.  rts
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  data
  93. string: dc.b "Taltos! Apr.3.93 in VBL",$d,$a,0
  94.  bss
  95.  align              ; align storage on word boundary
  96. program_end:  ds.l  0
  97.  end
  98.    
  99.